package xnj.lazydog.btcontroller.ControlViews;

import java.io.Serializable;

public class ViewOptions implements Serializable {

    //button  10 6  switch 10 6



    public static final int [] DEFAULT_WIDTH = new int []{
            10,
            10,
            20,
            20,
            5,
            20,
            20,
            20,
            20,
            20
    };

    public static final int [] DEFAULT_HEIGHT = new int []{
            6,
            6,
            6,
            6,
            20,
            5,
            20,
            20,
            20,
            6
    };
    public static final int DATA_TX = 0;
    public static final int DATA_RX = 1;

    public static final int [] DEFAULT_DATA_DIR = new int []{
            0,
            0,
            1,
            0,
            1,
            0,
            0,
            1,
            1,
            0
    };

    public static final int [] DEFAULT_DATA_TYPE = new int []{
            0,
            0,
            2,
            2,
            2,
            2,
            1,
            2,
            2,
            4
    };

    public static final int [] MIN_WIDTH = new int []{
            5,
            5,
            10,
            10,
            3,
            10,
            10,
            10,
            10,
            10
    };

    public static final int [] MIN_HEIGHT = new int []{
            3,
            3,
            3,
            3,
            10,
            3,
            10,
            10,
            10,
            3
    };

    // 控件主要分为两类：
    // 1.控制类，由用户操作，将设定的值打包发送给被控端。
    // 2.状态类，将接收的数值以图形方式显示到界面上。

    // 每个控件都要求有相应的数值与之链接。 有些控件可连接单个数值，有些控件链接的数值的数目是可变的。
    // 控件链接的数值的类型多种多样。其实其可以主要分为 整数型和浮点数型。整数型中，将bool型看做0~1的整数。将byte看成-128~127的整数，此外还有short和int。浮点数型中只有float类型。


    // 按钮控件，该控件有两种作用方式， 一种是可复原作用，一种是不可复原作用。
    // 1.可复原数值的按钮，其可以设置两个数值，一个是按下时的数值，另一个是没有按下时的数值。
    //   当用户按下相应的按钮后，其连接的数值就会被设为按下预设值。长按时，数值保持设定值不变。只有当按钮松开后，该数值复原为原值。
    // 2.不可复原按钮，其仅可以设置按下后的数值赋值动作，当按钮按下后，其链接的数值被赋值为指定的数值。按钮松开后，其数值不会复原，不可复原型的按钮一般是成对出现。实现对同一个数值的状态控制。

    // 按钮控件一般是链接 bool 型变量，以控制状态的开关，当然也可以与其它类型的变量链接。按钮控件支持与全类型的数值链接。

    // 按钮的下方需要使用text标明其链接的数值名称和大小。当按钮整体尺寸过小时，仅显示数值信息。
    public static final int UI_TYPE_BUTTON = 0;


    // 开关控件，此控件与手机的开关形状相同，功能也相同，其控制方式是，点击开关控件一次则开关状态翻转一次，并且通过图形反应出来。
    // 开关控件常用于链接bool数值，当然其也可以链接全类型的数值，对于不同的类型的数值，可以定义不同范围的开关特征值。
    // 所谓开关特征值，开特征值是当开关为开状态时其链接的数值的值。关特征值亦然。

    public static final int UI_TYPE_SWITCH = 1;

    // 由于按钮、开关等控件的特征值设置时不一致，因此对于控制类的数值，控制控件采用的是独占式的设定，一个控制类的数值只能被一个类型的控件控制。不会出现多个控制类控件链接一个控制数值的情况。
    // 显示类控件与控制类控件不同，其不会产生赋值冲突，因此仅约束控制类控件的数量为1，显示类的控件的链接数量不做限制。

    // 文本控件，用于显示状态数值，也可用于链接控制类数值。文本类控件的格式可设定，通过sprintf类似的方式给出显示格式，然后程序自动显示相应融合了数值的文本。
    // 文本控件可以链接多个全类型的数值，每个数值的变量类型可不同。数值显示的格式可以设置，可以为%d，%x 位数也可设置。
    // 文本控件在显示时，如果被点击，则会出现sprintf形式的格式修改界面，提供实时更改显示格式。
    public static final int UI_TYPE_TEXT = 2;

    // 可编辑文本，可编辑文本只能链接一个全类型数值，可编辑文本相对于文本控件，多了一个可点击修改其链接的数值的功能。
    // 可编辑文本的显示内容是固定的，一般是 "数值名称"+"："+"数值的值"，可通过点击，在弹出的窗口中修改数值。

    public static final int UI_TYPE_EDIT_TEXT = 3;

    // 能量槽控件，能量槽控件就是通过一个长条图形化的显示其链接的数值的大小。
    // 能量槽控件可链接全类型的数值，其显示的槽顶和槽底的上下限是可以设定的。

    public static final int UI_TYPE_VALUE_BAR = 4;


    // 拖动条控件，拖动条控件通过thumb供用户调节其链接的数值，上下限可调。

    public static final int UI_TYPE_VALUE_DRAG_BAR = 5;

    // X-Y轴的摇杆控件，可链接一组两个数值，上下限可设置。

    public static final int UI_TYPE_2AXIS_STICK = 6;


    // X-Y两轴的曲线图，链接一组两个数值，可设定图表数值范围，轨迹长度，轨迹是否衰减等。

    public static final int UI_TYPE_2AXIS_PLOT = 7;

    // Y-T曲线图，显示其链接数值随时间变化的曲线
    public static final int UI_TYPE_PLOT = 8;

    // 3D曲线图，可选择 散点图，点线图和曲线图。
    public static final int UI_TYPE_3AXIS_PLOT = 19;


    // 位图控件，暂时不考虑，实施比较复杂
    public static final int UI_TYPE_BITMAP = 20;



    // 数值按钮：数值按钮由三部分组成，两个按钮分别负责数值的增和减，一个可编辑文本负责显示。
    //   从而可以达到数值输入和微调两个功能。
    //   微调步长可设定。
    public static final int UI_TYPE_VALUE_BUTTON = 9;

    public static final int DATA_BOOL  = 0;
    public static final int DATA_BYTE  = 1;
    public static final int DATA_SHORT = 2;
    public static final int DATA_INT   = 3;
    public static final int DATA_FLOAT = 4;


    public static int THEME_FRONT_COLOR = 0xffffffff;
    public static int THEME_TEXT_COLOR = 0xffffffff;
    public static int THEME_BACK_COLOR = 0xffbbbbbb;
    public static int THEME_EDGE_COLOR = 0xff4eb7f0;
    public static int THEME_SELECT_COLOR = 0xffffffff;
    public static int THEME_TEXT_BACK_COLOR = 0xff444444;


    //// 基本属性 -------------------------
    public int x,y;    // 位置  以屏幕宽高的比例为单位
    public int w,h;    // 宽高  只以宽的比例为单位
    public float sx,sy;  // 宽高比例 原值为1 取值为 0.1~10
    public int deg;    // 逆时针倾斜角度


    //// 基本显示相关
    public int uiType=0;    // 界面类型

    public String label;

    Link [] links = new Link[6];

    public ViewOptions()
    {

    }
    public ViewOptions(int type)
    {
        uiType = type;
    }

    public void setLink(int index,int data_dir,int data_type,int data_index)
    {
        links[index] = new Link(data_dir,data_type,data_index);
    }
    public void removeLink(int index)
    {
        links[index] = null;
    }

    public void removeLinkAuto(int data_dir,int data_type,int data_index)
    {
        for(int i=0;i<links.length;i++)
        {
            if(links[i]!=null&&links[i].dir==data_dir&&links[i].type==data_type&&links[i].index==data_index)
            {
                links[i] = null;
            }
        }
    }
    public void remapLinkAuto(int data_dir,int data_type,int data_index) {
        for(int i=0;i<links.length;i++)
        {
            if(links[i]!=null&&links[i].dir==data_dir&&links[i].type==data_type&&links[i].index==data_index)
            {
                links[i].index--;
            }
        }
    }

    public int sample_point_size = 50; // 文本标签的位置
    //// 指示灯------------------------
    public float threshold=0.5f;  // 阈值，当链接的数值大于阈值，则指示灯亮，阈值手动输入   //在波形控件中，表示窗口中数据点的数量，即缩放系数
    //// 按钮------------------------
    public boolean  on_en=true;
    public boolean off_en=true;
    public float on_value = 1;   // 按钮按下时设定值
    //// 开关------------------------
    public float off_value = 0;  // 开关的on off 两个状态分别对应 on_value 和 off_value

    public float ms_per_data = Project.DEFAULT_TRANS_MS;

    //// 显示文本--------------------
    //public String format;    // 文本显示的格式 %2d

    //// 能量槽---------------------- 最大值和最小值，这里使用 on_value 和 off_value 分别记录，而不另行定义了





}
